package org.alesv.entranceExams.web.taglib;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @jsp.tag name="tabla" body-content="JSP"
 * @author mrojano
 */
public class TableTag extends TagSupport {

    /**
     * serialVersionUID.
     */
    private static final long   serialVersionUID = 1L;

    /**
     * El logger.
     */
    private static final Logger LOG              = LoggerFactory.getLogger(TableTag.class);

    /**
     * Objeto que contiene el listado, es obligatorio.
     */
    private List                list             = new ArrayList();

    /**
     * Nombre de la clase que se le aplica a la tabla.
     */
    private String              classTable       = "";

    /**
     * Nombre de la clase que se le aplica a la fila par.
     */
    private String              classPar         = "";

    /**
     * Nombre de la clase que se le aplica a la fila impar.
     */
    private String              classImpar       = "";

    /**
     * Titulo a mostrar.
     */
    private String              title            = "";

    /**
     * Url asociada al titulo.
     */
    private String              urlTitle         = "";

    /**
     * Base de la Url asociada al titulo, cuando esta es compuesta.
     */
    private String              baseUrlTitle     = "";

    /**
     * Sufijo que se puede pasar para componer la url del titulo.
     */
    private String              urlTitleSufix    = "";

    /**
     * Nombre del atributo de cada elemento del listado que se concatenará con el baseUrlTilte para construir la Url
     * asociada al titulo, cuando esta es compuesta.
     */
    private String              urlTitleParam    = "";

    /**
     * Fecha.
     */
    private String              date             = "";

    /**
     * Titulo de la fecha.
     */
    private String              dateTitle        = "";

    /**
     * Descripcion.
     */
    private String              desc             = "";

    /**
     * Fuente del recurso.
     */
    private String              source           = "";

    /**
     * Titulo de la fuente.
     */
    private String              sourceTitle      = "";

    /**
     * Duracion del recurso.
     */
    private String              duration         = "";

    /**
     * Titulo de la duracion.
     */
    private String              durationTitle    = "";

    /**
     * Titulo del comentario.
     */
    private String              commentTitle     = "";

    /**
     * Numero de comentarios.
     */
    private String              commentNum       = "";

    /**
     * Titulo de las recomendaciones.
     */
    private String              recomTitle       = "";

    /**
     * Numero de recomendaciones.
     */
    private String              recomNum         = "";

    /**
     * Indica si la recomendacion esta con la fecha o no.
     */
    private String              adviceWithDate   = "";

    /**
     * Titulo de la recomendacion.
     */
    private String              adviceTitle      = "";

    /**
     * Numero de la recomendacion.
     */
    private String              adviceNum        = "";

    /**
     * Titulo de la imagen.
     */
    private String              imageTitle       = "";

    /**
     * Url de la imagen.
     */
    private String              urlImage         = "";

    /**
     * Ruta de la imagen.
     */
    private String              srcImage         = "";

    /**
     * Indica si el enlace se abre en una ventana nueva. De estár presente este atributo, independientemente de su
     * valor, el enlace se abrirá en una ventana nueva.
     */
    private String              openNewWindow    = "";

    /**
     * Método llamado para iniciar el tratamiento del tag, incluirá el código html para generar los resultados de un
     * listado.
     * 
     * @return int EVAL_BODY_INCLUDE para que se siga evaluando el contenido de la etiqueta
     * @throws JspException
     *             JspException.
     */
    @Override
    public int doStartTag() throws JspException {
        JspWriter out = pageContext.getOut();
        try {
            buildList(out);
        } catch (IOException e) {

        }
        return EVAL_BODY_INCLUDE;
    }

    /**
     * Método encargado pintar todo el listado.
     * 
     * @param out
     *            out.
     * @throws JspException
     *             JspException.
     * @throws IOException
     *             IOException.
     */
    private void buildList(JspWriter out) throws JspException, IOException {
        out.write(buildList().toString());
    }

    /**
     * Construye el codigo HTML relacionado con el recurso, como fuente, duracion, comentario y recomendaciones.
     * 
     * @param source
     *            , valor de la fuente
     * @param sourceTitle
     *            titulo de la fuente
     * @param duration
     *            valor de la duracion
     * @param durationTitle
     *            titulo de la duracion
     * @param commentTitle
     *            titulo de los comentarios
     * @param commentNum
     *            numero de comentarios existentes
     * @param adviceWithDate
     *            indica si las recomendaciones van con la fecha o no
     * @param adviceTitle
     *            titulo de la recomendaciones
     * @param adviceNum
     *            numero de recomendaciones existentes
     * @return Codigo HTML correspondiente al recurso.
     */

    private Object createDataResourceHTML(String source, String sourceTitle, String duration, String durationTitle,
            String commentTitle, String commentNum, String adviceWithDate, String adviceTitle, String adviceNum) {
        StringBuffer sb = new StringBuffer();

        if (!source.equals("")) {
            sb.append("<span class=\"fuente\"><strong>");
            sb.append(sourceTitle); // hacerle el get.
            sb.append(": </strong>");
            sb.append(source);
            sb.append("</span>");
        }
        if (!duration.equals("")) {
            sb.append("<span class=\"duracion\"><strong>");
            sb.append(durationTitle);
            sb.append(": </strong>");
            sb.append(duration);
            sb.append("</span>");
        }
        if (!commentTitle.equals("")) {
            sb.append("<span class=\"comentarios\"><strong>");
            sb.append(commentTitle + " " + "(" + commentNum + ")");
            sb.append("</strong></span>");
        }
        if (adviceWithDate.equals("no")) {
            sb.append("<span class=\"autor\"><strong>");
            sb.append(adviceTitle + " " + "(" + adviceNum + ")");
            sb.append("</strong></span>");

        }
        return sb;
    }

    /**
     * Construye el codigo HTML de la imagen.
     * 
     * @param url
     *            , url de la imagen
     * @param title
     *            titulo de la imagen
     * @param src
     *            ruta fisica donde se ubica la imagen
     * @return Codigo HTML correspondiente a al imagen.
     */
    private StringBuffer createImageHTML(String url, String title, String src) {
        StringBuffer sb = new StringBuffer();
        if (!url.equals("")) {
            sb.append("<a href=\"");
            sb.append(url);
            sb.append("\"");
            sb.append(" title=\"");
            sb.append(title);
            sb.append("\"");
            if (!"".equals(getOpenNewWindow())) {
                sb.append(" target=\"_blank\"");
            }
            sb.append(">");
        }
        if (!src.equals("")) {
            sb.append("<img src=\"");
            sb.append(src);
            sb.append("\" alt=\"");
            sb.append(title);
            sb.append("\" />");
        }
        if (!url.equals("")) {
            sb.append("</a>");
        }
        return sb;
    }

    /**
     * Construye el codigo HTML correspondiente al titulo con enlace url.
     * 
     * @param title
     *            titulo
     * @param urlTitle
     *            url del titulo
     * @return Codigo HTML correspondiente al titulo.
     */
    private StringBuffer createTitleHTML(String title, String urlTitle) {
        StringBuffer sb = new StringBuffer();
        if (!title.equals("")) {
            sb.append("<a href=\"");
            sb.append(urlTitle);
            sb.append("\"");
            sb.append(" title=\"");
            sb.append(title);
            sb.append("\"");
            if (!"".equals(getOpenNewWindow())) {
                sb.append(" target=\"_blank\"");
            }
            sb.append(">");
            sb.append(title);
            sb.append("</a>");
        }
        return sb;
    }

    /**
     * Construye el codigo HTML correspondiente a la descripcion.
     * 
     * @param description
     *            descripcion
     * @return Codigo HTML correspondiente a la descripcion
     */
    private StringBuffer createDescHTML(String description) {
        StringBuffer sb = new StringBuffer();
        if (!description.equals("")) {
            sb.append("<p>");
            sb.append(description);
            sb.append("</p>");
        }

        return sb;
    }

    /**
     * Construye el codigo HTML para la fecha con o sin titulo y en el caso en el cual se indique construye tambien
     * seguidamente despues de la fecha el codigo HTML para mostrar las recomendaciones.
     * 
     * @param date
     *            fecha
     * @param dateTitle
     *            titulo de la fecha
     * @param adviceWithDate
     *            indica si las recomendaciones se muestran con las fechas
     * @param adviceTitle
     *            titulo de las recomendaciones
     * @param adviceNum
     *            numero de recomendaciones
     * @return Codigo HTML correspondiente a la fecha y adicionalmente las recomendaciones
     */
    private StringBuffer createDateHTML(String date, String dateTitle, String adviceWithDate, String adviceTitle,
            String adviceNum) {
        StringBuffer sb = new StringBuffer();
        if (!date.equals("")) {
            sb.append("<p>");
            sb.append("<span class=\"fecha\">");
            if (!dateTitle.equals("")) {
                sb.append("<strong>");
                sb.append(dateTitle);
                sb.append("&nbsp;:&nbsp;</strong>");
            }
            sb.append(date);
            sb.append("</span>");
            if (adviceWithDate.equals("yes") && !adviceTitle.equals("") && !adviceNum.equals("")) {
                sb.append("<span class=\"autor\"><strong>");
                sb.append(adviceTitle + " " + "(" + adviceNum + ")");
                sb.append("</strong></span>");
            }
            sb.append("</p>");
        }
        return sb;
    }

    /**
     * Devuelve el resultado de un método de un pojo.
     * 
     * @param obj
     *            , objeto
     * @param name
     *            , nombre del metodo
     * @return el resultado de ejecutar el metodo
     * @throws NoSuchMethodException
     *             NoSuchMethodException.
     * @throws SecurityException
     *             SecurityException.
     * @throws InvocationTargetException
     *             InvocationTargetException.
     * @throws IllegalAccessException
     *             IllegalAccessException.
     * @throws IllegalArgumentException
     *             IllegalArgumentException.
     */
    private Object getResultMethod(Object obj, String name) throws SecurityException, NoSuchMethodException,
        IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        Method method = null;
        Object resultMethod;
        Class[] empty = new Class[0];
        Object[] emptyObjects = new Object[0];
        String nameBean = null;
        StringTokenizer token = new StringTokenizer(name, ".");
        if (name.indexOf(".") != -1) {
            resultMethod = obj;
            while (token.hasMoreTokens()) {
                nameBean = token.nextToken();
                if (resultMethod != null) {
                    method = resultMethod.getClass().getMethod("get" + Utils.firstUpper(nameBean), empty);
                    resultMethod = (Object) method.invoke(resultMethod, emptyObjects);
                }
            }
        } else {
            method = obj.getClass().getMethod("get" + Utils.firstUpper(name), empty);
            resultMethod = (Object) method.invoke(obj, emptyObjects);
        }
        return resultMethod;
    }

    /**
     * Ejecuta el metodo del objeto correspondiente si contiene ese metodo en otro caso devuelve la cadena vacia.
     * 
     * @param obj
     *            , objeto del listado
     * @param property
     *            , nombre del metodo
     * @return Resultado de ejecutar el metodo en forma de String
     */
    private String getValueObject(Object obj, String property) {
        String res = "";
        try {
            if (!property.equals("")) {
                Object value = getResultMethod(obj, property);
                if (value != null) {
                    res = value.toString();
                }
            }
        } catch (Exception e) {
            LOG.info("IllegalArgumentException accediendo a " + property);
        }
        return res;
    }

    /**
     * Genera el codigo HTML relacionado con el recurso, como fuente, duracion, comentario y recomendaciones.
     * 
     * @param obj
     *            , objeto del listado
     * @return Codigo HTML correspondiente al recurso.
     */
    private StringBuffer createDataResource(Object obj) {
        StringBuffer sb = new StringBuffer();
        sb.append(createDataResourceHTML(getValueObject(obj, source), sourceTitle, getValueObject(obj, duration),
                durationTitle, commentTitle, getValueObject(obj, commentNum), this.adviceWithDate, adviceTitle,
                getValueObject(obj, adviceNum)));

        return sb;
    }

    /**
     * Genera el codigo HTML correspondiente a la descripcion.
     * 
     * @param obj
     *            , objeto del listado
     * @return Codigo HTML correspondiente a la descripcion
     */
    private StringBuffer createDesc(Object obj) {
        StringBuffer sb = new StringBuffer();
        sb.append(createDescHTML(getValueObject(obj, desc)));
        return sb;
    }

    /**
     * Genera el codigo HTML para la fecha con o sin titulo y en el caso en el cual se indique construye tambien
     * seguidamente despues de la fecha el codigo HTML para mostrar las recomendaciones.
     * 
     * @param obj
     *            , objeto del listado
     * @return Codigo HTML correspondiente a la fecha y adicionalmente las recomendaciones
     */
    private StringBuffer createDate(Object obj) {
        StringBuffer sb = new StringBuffer();
        sb.append(createDateHTML(getValueObject(obj, date), dateTitle, adviceWithDate, adviceTitle,
                getValueObject(obj, adviceNum)));
        return sb;
    }

    /**
     * Genera el codigo HTML correspondiente al titulo con enlace url.
     * 
     * @param obj
     *            , objeto del listado
     * @return Codigo HTML correspondiente al titulo.
     */
    private StringBuffer createTitle(Object obj) {
        StringBuffer sb = new StringBuffer();
        String theUrl = "#";
        if (StringUtils.isEmpty(urlTitle)) {
            try {
                theUrl = baseUrlTitle + getValueObject(obj, urlTitleParam);
            } catch (Exception e) {
                LOG.info("Except controlled");
            }
        } else {
            theUrl = getValueObject(obj, urlTitle);
        }

        if (!StringUtils.isEmpty(urlTitleSufix)) {
            theUrl += urlTitleSufix;
        }

        sb.append(createTitleHTML(getValueObject(obj, title), theUrl));
        return sb;

    }

    /**
     * Construye el codigo HTML del elemento DIV que contiene todos los datos posibles excepto la imagen.
     * 
     * @param obj
     *            , objeto del listado
     * @return Codigo HTML correspondiente a un DIV
     */
    private StringBuffer createDivItem(Object obj) {

        StringBuffer sb = new StringBuffer();

        sb.append("<div class=\"item\">");
        sb.append(createTitle(obj));
        sb.append(createDate(obj));
        sb.append(createDesc(obj));
        sb.append(createDataResource(obj));
        sb.append("</div>");

        return sb;

    }

    /**
     * Genera el codigo HTML de la imagen.
     * 
     * @param obj
     *            , objeto del listado
     * @return Codigo HTML correspondiente a al imagen.
     */
    private StringBuffer createImage(Object obj) {
        StringBuffer sb = new StringBuffer();
        sb.append(createImageHTML(getValueObject(obj, urlImage), getValueObject(obj, imageTitle),
                getValueObject(obj, srcImage)));
        return sb;
    }

    /**
     * Construye el codigo HTML de una fila de la tabla.
     * 
     * @param cont
     *            , contador para saber si la fila es par o impar
     * @param obj
     *            , objeto del listado
     * @return Codigo HTML de una fila
     */
    private StringBuffer createTR(int cont, Object obj) {

        StringBuffer sb = new StringBuffer();

        sb.append("\t<tr class=\"");
        // clase segun la posicion
        if ((cont % 2) == 0) {
            sb.append(classPar);
        } else {
            sb.append(this.classImpar);
        }
        sb.append("\">\n");
        sb.append("\t\t<td class=\"esqsupizq\">");
        sb.append(createImage(obj));
        sb.append(createDivItem(obj));
        sb.append("</p>");
        sb.append("</td>\n");
        sb.append("\t</tr>");

        return sb;
    }

    /**
     * Construye la tabla HTML asociada al listado.
     * 
     * @return Codigo HTML de la tabla
     * @throws JspException
     *             JspException.
     * @throws IOException
     *             IOException.
     */
    private StringBuffer buildList() throws JspException, IOException {
        StringBuffer sb = new StringBuffer();
        int cont = 1;
        Iterator iterador, iteradorItems = null;
        Object fila = null;

        try {
            sb.append("<table id=\"table1\" class=\"");
            sb.append(classTable);
            sb.append("\" cellspacing=\"0\" cellpadding=\"0\" id=\"" + id + "\" border=\"0\">\n");
            sb.append("<thead><tr><th></th></tr></thead>");
            sb.append("\t<tbody>\n");

            if (list != null) {
                for (iteradorItems = list.iterator(); iteradorItems.hasNext(); cont++) {
                    fila = (Object) iteradorItems.next();
                    sb.append(createTR(cont, fila));
                }
            }
        } catch (Exception e) {
            LOG.info("IllegalArgumentException al contruir la tabla");
        }
        sb.append("\t</tbody>\n");
        // sb.append("<tfoot><tr><th>Col 1</th></tr></tfoot>");

        sb.append("</table>\n");

        return sb;
    }

    /**
     * Retorna la lista de objetos.
     * 
     * @return lista de objetos
     */
    public List getList() {
        return list;
    }

    /**
     * Estable la lista de objetos.
     * 
     * @param list
     *            lista de objetos que van a componer el listado
     */
    public void setList(List list) {
        this.list = list;
    }

    /**
     * Retorna el nombre de la clase asignado a la tabla.
     * 
     * @return nombre de la clase
     */
    public String getClassTable() {
        return classTable;
    }

    /**
     * Establece el nombre de la clase asignado a la tabla.
     * 
     * @param classTable
     *            nombre de la clase
     */
    public void setClassTable(String classTable) {
        this.classTable = classTable;
    }

    /**
     * Retorna el nombre de la clase asignada a la fila par de la tabla.
     * 
     * @return nombre de la clase.
     */
    public String getClassPar() {
        return classPar;
    }

    /**
     * Establece el nombre de la clase asignada a la fila par de la tabla.
     * 
     * @param classPar
     *            classPar.
     */
    public void setClassPar(String classPar) {
        this.classPar = classPar;
    }

    /**
     * Retorna el nombre de la clase asignada a la fila impar de la tabla.
     * 
     * @return nombre de la clase.
     */
    public String getClassImpar() {
        return classImpar;
    }

    /**
     * Establece el nombre de la clase asignada a la fila impar de la tabla.
     * 
     * @param classImpar
     *            classImpar.
     */
    public void setClassImpar(String classImpar) {
        this.classImpar = classImpar;
    }

    /**
     * Retorna el titulo.
     * 
     * @return titulo.
     */
    public String getTitle() {
        return title;
    }

    /**
     * Establece el titulo.
     * 
     * @param title
     *            titulo
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     * Retorna la url asociada al titulo.
     * 
     * @return url del titulo
     */
    public String getUrlTitle() {
        return urlTitle;
    }

    /**
     * Establece al url asociada al titulo.
     * 
     * @param urlTitle
     *            url del titulo
     */
    public void setUrlTitle(String urlTitle) {
        this.urlTitle = urlTitle;
    }

    /**
     * @return the baseUrlTitle
     */
    public String getBaseUrlTitle() {
        return baseUrlTitle;
    }

    /**
     * @param baseUrlTitle
     *            the baseUrlTitle to set
     */
    public void setBaseUrlTitle(String baseUrlTitle) {
        this.baseUrlTitle = baseUrlTitle;
    }

    /**
     * @return the urlTitleParam
     */
    public String getUrlTitleParam() {
        return urlTitleParam;
    }

    /**
     * @param urlTitleParam
     *            the urlTitleParam to set
     */
    public void setUrlTitleParam(String urlTitleParam) {
        this.urlTitleParam = urlTitleParam;
    }

    /**
     * Retorna la fecha.
     * 
     * @return fecha
     */
    public String getDate() {
        return date;
    }

    /**
     * Establece la fecha.
     * 
     * @param date
     *            fecha
     */
    public void setDate(String date) {
        this.date = date;
    }

    /**
     * Retorna el titulo asociado a la fecha.
     * 
     * @return el titulo asociado a la fecha
     */
    public String getDateTitle() {
        return dateTitle;
    }

    /**
     * Establece el titulo asociado a la fecha.
     * 
     * @param dateTitle
     *            titulo asociado a la fecha
     */
    public void setDateTitle(String dateTitle) {
        this.dateTitle = dateTitle;
    }

    /**
     * Retorna la descripcion.
     * 
     * @return descripcion
     */
    public String getDesc() {
        return desc;
    }

    /**
     * Establece la descripcion.
     * 
     * @param desc
     *            descripcion
     */
    public void setDesc(String desc) {
        this.desc = desc;
    }

    /**
     * Retorna la fuente.
     * 
     * @return fuente
     */
    public String getSource() {
        return source;
    }

    /**
     * Establece la fuente.
     * 
     * @param source
     *            fuente
     */
    public void setSource(String source) {
        this.source = source;
    }

    /**
     * Retorna el titulo asociado a al fuente.
     * 
     * @return titulo asociado a la fuente
     */
    public String getSourceTitle() {
        return sourceTitle;
    }

    /**
     * @param sourceTitle
     *            sourceTitle.
     */
    public void setSourceTitle(String sourceTitle) {
        this.sourceTitle = sourceTitle;
    }

    /**
     * @return String
     */
    public String getDuration() {
        return duration;
    }

    /**
     * @param duration
     *            duration
     */
    public void setDuration(String duration) {
        this.duration = duration;
    }

    /**
     * @return String
     */
    public String getDurationTitle() {
        return durationTitle;
    }

    /**
     * @param durationTitle
     *            durationTitle.
     */
    public void setDurationTitle(String durationTitle) {
        this.durationTitle = durationTitle;
    }

    /**
     * @return String
     */
    public String getCommentTitle() {
        return commentTitle;
    }

    /**
     * @param commentTitle
     *            commentTitle.
     */
    public void setCommentTitle(String commentTitle) {
        this.commentTitle = commentTitle;
    }

    /**
     * @return String
     */
    public String getCommentNum() {
        return commentNum;
    }

    /**
     * @param commentNum
     *            commentNum.
     */
    public void setCommentNum(String commentNum) {
        this.commentNum = commentNum;
    }

    /**
     * @return the recomTitle
     */
    public String getRecomTitle() {
        return recomTitle;
    }

    /**
     * @param recomTitle
     *            the recomTitle to set
     */
    public void setRecomTitle(String recomTitle) {
        this.recomTitle = recomTitle;
    }

    /**
     * @return the recomNum
     */
    public String getRecomNum() {
        return recomNum;
    }

    /**
     * @param recomNum
     *            the recomNum to set
     */
    public void setRecomNum(String recomNum) {
        this.recomNum = recomNum;
    }

    /**
     * @return String
     */
    public String getAdviceWithDate() {
        return adviceWithDate;
    }

    /**
     * @param adviceWithDate
     *            adviceWithDate.
     */
    public void setAdviceWithDate(String adviceWithDate) {
        this.adviceWithDate = adviceWithDate;
    }

    /**
     * @return String
     */
    public String getAdviceTitle() {
        return adviceTitle;
    }

    /**
     * @param adviceTitle
     *            adviceTitle.
     */
    public void setAdviceTitle(String adviceTitle) {
        this.adviceTitle = adviceTitle;
    }

    /**
     * @return String
     */
    public String getAdviceNum() {
        return adviceNum;
    }

    /**
     * @param adviceNum
     *            adviceNum.
     */
    public void setAdviceNum(String adviceNum) {
        this.adviceNum = adviceNum;
    }

    /**
     * @return String
     */
    public String getImageTitle() {
        return imageTitle;
    }

    /**
     * @param imageTitle
     *            imageTitle.
     */
    public void setImageTitle(String imageTitle) {
        this.imageTitle = imageTitle;
    }

    /**
     * @return String
     */
    public String getUrlImage() {
        return urlImage;
    }

    /**
     * @param urlImage
     *            urlImage.
     */
    public void setUrlImage(String urlImage) {
        this.urlImage = urlImage;
    }

    /**
     * @return String
     */
    public String getSrcImage() {
        return srcImage;
    }

    /**
     * @param srcImage
     *            srcImage.
     */
    public void setSrcImage(String srcImage) {
        this.srcImage = srcImage;
    }

    /**
     * @return the openNewWindow
     */
    public String getOpenNewWindow() {
        return openNewWindow;
    }

    /**
     * @param openNewWindow
     *            the openNewWindow to set
     */
    public void setOpenNewWindow(String openNewWindow) {
        this.openNewWindow = openNewWindow;
    }

    /**
     * @return the urlTitleSufix
     */
    public String getUrlTitleSufix() {
        return urlTitleSufix;
    }

    /**
     * @param urlTitleSufix
     *            the urlTitleSufix to set
     */
    public void setUrlTitleSufix(String urlTitleSufix) {
        this.urlTitleSufix = urlTitleSufix;
    }

}
